package com.class05.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;

/**
 * @ClassDescription: 定义四个增强方法，获取目标方法的信息 返回值  异常对象
 * <p>
 * 1、定义方法 -增强代码
 * 2、使用注解直接指定对应的位置
 * 3、配置切点表达式选中方法
 * 4、切面和ioc的配置
 * 5、开启aspectj注解支持
 * todo ：增强方法中获取目标方法信息
 * 1、全部增强方法中，获取目标方法的信息
 * (方法名，参数，访问修饰符，所属的类的信息)
 * (JoinPoint joinPoint)
 * import org.aspectj.lang.JoinPoint;
 * joinPoint 包含目标方法信息！
 * 2、返回结果 -@AfterReturning
 * (Object result) result接收返回结果
 * @AfterReturning(value="execution(* com..impl.*.*(..))",
 * returning = "形参名即可")
 * 3、异常的信息   @AfterThrowing
 * (Throwable t) t接受异常信息
 * @AfterThrowing(value="execution(* com..impl.*.*(..))",
 * throwing = "形参名即可")
 * @JdkVersion: 17
 * @Author: yxy
 * @Created: 2023/11/3 8:30
 */
//@Component
//@Aspect
public class MyAdvice {
//    前置
//    @Before("com.class05.pointcut.MyPointCut.pc()")
    public void before(JoinPoint joinPoint) throws NoSuchMethodException {
//        1、获取方法属于的类信息
//        getTarget()获取被代理的对象
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        System.out.println(simpleName);
//        2、获取方法名称
//       2.1、 getSignature() 获取封装了署名信息的对象,
//        在该对象中可以获取到目标方法名,所属类的Class等信息
//       2.2、Object getThis();	获取代理对象
        int modifiers = joinPoint.getSignature().getModifiers();
        String s = Modifier.toString(modifiers);
        System.out.println(s);
        String name = joinPoint.getSignature().getName();


        System.out.println(name);
//        3、获取参数列表
//        获取目标方法的参数
        List<Object> args = Arrays.asList(joinPoint.getArgs());
        System.out.println(args);


    }
//    后置
    @AfterReturning(value = "com.class05.pointcut.MyPointCut.pc()",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result){
        System.out.println(result);
    }
//    最后
    @After("com.class05.pointcut.MyPointCut.pc()")
    public void after(JoinPoint joinPoint){
//        1、获取方法属于的类信息
//        getTarget()获取被代理的对象
        String simpleName = joinPoint.getTarget().getClass().getSimpleName();
        System.out.println(simpleName);
//        2、获取方法名称
//       2.1、 getSignature() 获取封装了署名信息的对象,
//        在该对象中可以获取到目标方法名,所属类的Class等信息
//       2.2、Object getThis();	获取代理对象
        int modifiers = joinPoint.getSignature().getModifiers();
        String s = Modifier.toString(modifiers);
        System.out.println(s);
        String name = joinPoint.getSignature().getName();
    }
//    异常
    @AfterThrowing(value = "com.class05.pointcut.MyPointCut.pc()",throwing ="throwable" )
    public void afterThrowing(JoinPoint joinPoint,Throwable throwable){
        System.out.println(throwable);
    }
}
